package com.mpsc.multi.source.config.datasource;

/**
 * 配合DataSourceConfig2 类使用
 */
//@Slf4j
//@Component
public class DataSourceRunner //implements CommandLineRunner
{
//    private static int max;
//    private static int min;
//    private static String dbPrefix;
//    private static final String datasourcePrefix = "spring.datasource.";
//
//    @Autowired
//    private Environment environment;
//    @Value("${spring.rule}")
//    private String datasourceRule;
//    @Autowired
//    private DynamicDataSource dynamicDataSource;
//
//    @Autowired
//    public ApplicationContext applicationContext;
//
//    private static ExecutorService executor = Executors.newFixedThreadPool(4);
//
//    public boolean dataSourceTask() {
//        //获取分库规则
//        getDatasourceMaxAndMin();
//        //数据库基本信息配置
//        String driverClassName;
//        String jdbcUrl;
//        String username;
//        String password;
//        // 配置多数据源
//        Map<Object, Object> dsMap = new HashMap();
//        HikariConfig hikariConfig;
//        HikariDataSource hikariDataSource;
//        for (int i = min; i <= max; i++) {
//            driverClassName = environment.getProperty(datasourcePrefix + dbPrefix + i + ".driver-class-name");
//            jdbcUrl = environment.getProperty(datasourcePrefix + dbPrefix + i + ".jdbc-url");
//            username = environment.getProperty(datasourcePrefix + dbPrefix + i + ".username");
//            password = environment.getProperty(datasourcePrefix + dbPrefix + i + ".password");
//            //创建数据源
//            hikariConfig = new HikariConfig();
//            hikariConfig.setDriverClassName(driverClassName);
//            hikariConfig.setJdbcUrl(jdbcUrl);
//            hikariConfig.setUsername(username);
//            hikariConfig.setPassword(password);
//            hikariDataSource = new HikariDataSource(hikariConfig);
//            dsMap.put(dbPrefix + i, hikariDataSource);
//            registerDataSource(dbPrefix + i, hikariConfig);
//        }
//        //Object db1 = applicationContext.getBean("db1");
//        dynamicDataSource.setTargetDataSources(dsMap);
//        dynamicDataSource.afterPropertiesSet();
//        return true;
//    }
//
//    /**
//     * 动态的将数据源注入到容器中
//     *
//     * @param dbName       数据库名称
//     * @param hikariConfig 数据源配置信息
//     */
//    private void registerDataSource(String dbName, HikariConfig hikariConfig) {
//        if (!"db1".equals(dbName)) {
//            ConfigurableApplicationContext configurableApplicationContext = (AbstractApplicationContext) applicationContext;
//            // 获取bean工厂并转换为DefaultListableBeanFactory
//            DefaultListableBeanFactory defaultListableBeanFactory =
//                    (DefaultListableBeanFactory) configurableApplicationContext.getBeanFactory();
//            BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.rootBeanDefinition(HikariDataSource.class);
//            AbstractBeanDefinition rawBeanDefinition = beanDefinitionBuilder.getRawBeanDefinition();
//            rawBeanDefinition.getConstructorArgumentValues().addGenericArgumentValue(hikariConfig);
//            // defaultListableBeanFactory.removeBeanDefinition("db1");
//            defaultListableBeanFactory.registerBeanDefinition(dbName, beanDefinitionBuilder.getBeanDefinition());
//        }
//    }
//
//
//    /**
//     * 获取分库rule，计算分库
//     * db->${1..2}
//     */
//    private boolean getDatasourceMaxAndMin() {
//        //String datasourceRule = environment.getProperty(multiSourceRule);
//        if (StringUtils.isNotEmpty(datasourceRule)) {
//            String[] rules = datasourceRule.split("->");
//            dbPrefix = rules[0];
//            String rulesNum = rules[1].substring(1, rules[1].length() - 1);
//            String[] dataNum = rulesNum.split("-");
//            min = Integer.parseInt(dataNum[0]);
//            max = Integer.parseInt(dataNum[1]);
//            if (min > max) {
//                int t = max;
//                max = min;
//                min = t;
//            }
//        } else {
//            throw new RuntimeException("缺少数据库分片spring.rule配置");
//        }
//        return true;
//    }
//
//    @Override
//    public void run(String... args) throws Exception {
//        executor.submit(this::dataSourceTask).get();
//    }
}
